package Main;

import dgbi.BiGrafo;

import java.util.ArrayList;
import java.io.*;
public class Parser {

	static int cantOp = 0;
	
	public static ArrayList<dgbi.BiGrafo> Parser() 
	{
		Parser parser = new Parser(); 
		File fileIn = new File("Tp3.in");
		ArrayList<dgbi.BiGrafo> array = new ArrayList<BiGrafo>();
		FileReader frIn = null;
		try {
			frIn = new FileReader(fileIn);
			BufferedReader in = new BufferedReader(frIn);
                        array =  levantoDatos(in);
			
			

		} catch (IOException e) {
			System.out.println("NO SE PUDO LEER EL ARCHIVO");
			e.printStackTrace();
		} finally {
			try {
				if ( frIn != null )
					frIn.close();
			} catch (IOException e) {
				System.out.println("Error al cerrar el archivo de entrada");
			}
                        return array;
		}
	}

private static ArrayList<dgbi.BiGrafo> levantoDatos(BufferedReader br) throws NumberFormatException,
	IOException {
	
		int nodo;
		Integer nAux = null;
                dgbi.BiGrafo big;
                ArrayList<dgbi.BiGrafo> array = new ArrayList<dgbi.BiGrafo>();
		// Agrego V1
		
			String sAux = br.readLine();
			while(nAux.valueOf(sAux).intValue() != -1)
                        {
                  //          int maxV1 = 0;
                  //          int maxiV1 = 0;
                  //          int maxV2 = 0;
                  //          int maxiV2 = 0;
                            big = new BiGrafo();
                            int cantV1 = nAux.valueOf(sAux).intValue();


                            for(cantV1 = cantV1;cantV1 > 0;cantV1--){

                                    sAux = br.readLine();
                                    nodo = nAux.valueOf(sAux).intValue();
                                    dgbi.Node n = new dgbi.Node(nodo,true,-1);

                                    big.insertarEnV1(n,big.v1.size());
                            }

                    // Agrego V2
                            sAux = br.readLine();
                            int cantV2 = nAux.valueOf(sAux).intValue();

                            for(cantV2 = cantV2;cantV2 > 0;cantV2--){

                                    sAux = br.readLine();
                                    nodo = nAux.valueOf(sAux).intValue();
                                    dgbi.Node n = new dgbi.Node(nodo,true,-1);
                                    big.insertarEnV2(n,big.v2.size());
                            }

                    // Agrego aristas V1 a V2	

                            sAux = br.readLine();
                            int cantEjes = nAux.valueOf(sAux).intValue();
                            Integer n1 = new Integer(0);
                            Integer n2 = new Integer(0);
                            dgbi.Node nodo1 = null;
                            dgbi.Node nodo2 = null;
                            big.cantEjesFijo = cantEjes;
                            for(cantEjes =cantEjes;cantEjes > 0;cantEjes--){	

                                    String[] temp = new String[2];
                                    temp = br.readLine().trim().split("\\s+");

                                    for(dgbi.Node n :big.v1){
                                            if(n.v == n1.valueOf(temp[0]).intValue()){
                                                    nodo1 = n;
                                                    break;
                                            }
                                    }

                                    for(dgbi.Node n :big.v2){
                                            if(n.v == n2.valueOf(temp[1]).intValue()){
                                                    nodo2 = n;
                                                    break;
                                            }
                                    }

                                    // Agrego el Eje
                                    nodo1.ady.add(nodo2);
                                    nodo2.ady.add(nodo1);

                            }


                    // Agrego V1' a V1
                            sAux = br.readLine();
                            int cantiV1 = nAux.valueOf(sAux).intValue();

                            for(cantiV1 = cantiV1;cantiV1 > 0;cantiV1--){

                                    sAux = br.readLine();
                                    nodo = nAux.valueOf(sAux).intValue();
                                    dgbi.Node n = new dgbi.Node(nodo,false,-1);

                                    big.iv1.add(n);
                            }

                    // Agrego V2' a V2

                            sAux = br.readLine();
                            int cantiV2 = nAux.valueOf(sAux).intValue();

                            for(cantiV2 = cantiV2;cantiV2 > 0;cantiV2--){

                                    sAux = br.readLine();
                                    nodo = nAux.valueOf(sAux).intValue();
                                    dgbi.Node n = new dgbi.Node(nodo,false,-1);

                                    big.iv2.add(n);
                            }

                    // Agrego Aristas de IV1 a IV2


                            sAux = br.readLine();
                            cantEjes = nAux.valueOf(sAux).intValue();
                            n1 = new Integer(0);
                            n2 = new Integer(0);
                            nodo1 = null;
                            nodo2 = null;
                            big.cantEjesParticionAAgregar = cantEjes;
                            for(cantEjes =cantEjes;cantEjes > 0;cantEjes--){	
                                    boolean vieneiv1 = false;
                                    String[] temp = new String[2];
                                    temp = br.readLine().trim().split("\\s+");
                                    if(n1.valueOf(temp[0]).intValue() > big.v1.size()+big.v2.size()+big.iv1.size())
                                    {
                                        for(dgbi.Node n :big.iv2)
                                        {
                                                if(n.v == n1.valueOf(temp[0]).intValue())
                                                {
                                                        nodo1 = n;
                                                        break;
                                                }
                                        }
                                    }
                                    else if(n1.valueOf(temp[0]).intValue() > big.v1.size()+big.v2.size())
                                    {                                
                                        for(dgbi.Node n :big.iv1)
                                        {
                                            if(n.v  == n1.valueOf(temp[0]).intValue())
                                            {
                                                    nodo1 = n;
                                                    vieneiv1 = true;
                                                    break;
                                            }
                                        }
                                    }
                                    else if(n1.valueOf(temp[0]).intValue() <= big.v1.size())
                                    {                                
                                        for(dgbi.Node n :big.v1)
                                        {
                                            if(n.v  == n1.valueOf(temp[0]).intValue())
                                            {
                                                    nodo1 = n;
                                                    vieneiv1 = true;
                                                    break;
                                            }
                                        }
                                    }
                                    else
                                    {                                
                                        for(dgbi.Node n :big.v2)
                                        {
                                            if(n.v  == n1.valueOf(temp[0]).intValue())
                                            {
                                                    nodo1 = n;
                                                    break;
                                            }
                                        }
                                    }                                
                                    if(vieneiv1)
                                    {
                                        if(n1.valueOf(temp[1]).intValue() > big.v1.size()+big.v2.size()+big.iv1.size())
                                        {
                                            for(dgbi.Node n :big.iv2)
                                            {
                                                    if(n.v == n2.valueOf(temp[1]).intValue())
                                                    {
                                                            nodo2 = n;
                                                            break;
                                                    }
                                            }
                                        }
                                        else
                                        {
                                            for(dgbi.Node n :big.v2)
                                            {
                                                    if(n.v == n2.valueOf(temp[1]).intValue())
                                                    {
                                                            nodo2 = n;
                                                            break;
                                                    }
                                            }
                                        }
                                    }
                                    else
                                    {
                                        if(n1.valueOf(temp[1]).intValue() > big.v1.size()+big.v2.size())
                                        {
                                            for(dgbi.Node n :big.iv1)
                                            {
                                                    if(n.v == n2.valueOf(temp[1]).intValue())
                                                    {
                                                            nodo2 = n;
                                                            break;
                                                    }
                                            }
                                        }
                                        else
                                        {
                                            for(dgbi.Node n :big.v1)
                                            {
                                                    if(n.v == n2.valueOf(temp[1]).intValue())
                                                    {
                                                            nodo2 = n;
                                                            break;
                                                    }
                                            }
                                        }
                                    }
                                    // Agrego el Eje
                                    nodo1.ady.add(nodo2);
                                    nodo2.ady.add(nodo1);

                            }
                            big.cantElementosOriginalV1 = big.v1.size();
                            big.cantElementosOriginalV2 = big.v2.size();
                            big.cantElementosOriginaliV1 = big.iv1.size();
                            big.cantElementosOriginaliV2 = big.iv2.size();
                            array.add(big);
                            sAux = br.readLine();
			}
                        return array;
                        
                       // sAux = br.readLine();
                       // int cantiEjes = nAux.valueOf(sAux).intValue();
                       // int ejeN1;
                      //  int ejeN2;
                      //  for(cantiEjes = cantiEjes;cantiEjes > 0;cantiEjes--){			
                       //         String[] temp = new String[2];
                       //         temp = br.readLine().trim().split("\\s+");

                        //        ejeN1 = n1.valueOf(temp[0]);
                       //         ejeN2 = n2.valueOf(temp[1]);

                       //         int[] eje = {ejeN1 ,ejeN2};
                       //         big.iEjes.add(eje);
	}

        public static void ImprimirSalidaConstructiva(ArrayList<dgbi.BiGrafo> bigrafo)
        {
            
            try {
                File test = new File("Tp32.out");
                FileOutputStream testStream = new FileOutputStream(test);
                PrintStream salidaTest = new PrintStream(testStream);         
                for(dgbi.BiGrafo b : bigrafo)
                {
                    salidaTest.print(b.cruces+"\n");
                    String linea = "";
                    for(int i = 0; i<b.v1.size()-1;i++)
                    {
                        linea += b.v1.get(i).v + " ";
                    }
                    linea += b.v1.get(b.v1.size()-1).v + "\n";
                    salidaTest.print(linea);
                    linea = "";
                    for(int i = 0; i<b.v2.size()-1;i++)
                    {
                        linea += b.v2.get(i).v + " ";
                    }
                    linea += b.v2.get(b.v2.size()-1).v + "\n";
                    salidaTest.print(linea);
                }
            } catch (IOException e) {
                    System.out.println("Error al cerrar el archivo grafo");
            }
        }
        
        public  static void ImprimirSalidaExacto(ArrayList<dgbi.BiGrafo> bigrafo)
        {
            
            try {
                File test = new File("Tp31.out");
                FileOutputStream testStream = new FileOutputStream(test);
                PrintStream salidaTest = new PrintStream(testStream);         
                for(dgbi.BiGrafo b : bigrafo)
                {
                    salidaTest.print(b.cruces+"\n");
                    String linea = "";
                    for(int i = 0; i<b.v1.size()-1;i++)
                    {
                        linea += b.v1.get(i).v + " ";
                    }
                    linea += b.v1.get(b.v1.size()-1).v + "\n";
                    salidaTest.print(linea);
                    linea = "";
                    for(int i = 0; i<b.v2.size()-1;i++)
                    {
                        linea += b.v2.get(i).v + " ";
                    }
                    linea += b.v2.get(b.v2.size()-1).v + "\n";
                    salidaTest.print(linea);
                }
            } catch (IOException e) {
                    System.out.println("Error al cerrar el archivo grafo");
            }
        }
        public static void ImprimirSalidaLocal(ArrayList<dgbi.BiGrafo> bigrafo)
        {
            
            try {
                File test = new File("Tp33.out");
                FileOutputStream testStream = new FileOutputStream(test);
                PrintStream salidaTest = new PrintStream(testStream);         
                for(dgbi.BiGrafo b : bigrafo)
                {
                    salidaTest.print(b.cruces+"\n");
                    String linea = "";
                    for(int i = 0; i<b.v1.size()-1;i++)
                    {
                        linea += b.v1.get(i).v + " ";
                    }
                    linea += b.v1.get(b.v1.size()-1).v + "\n";
                    salidaTest.print(linea);
                    linea = "";
                    for(int i = 0; i<b.v2.size()-1;i++)
                    {
                        linea += b.v2.get(i).v + " ";
                    }
                    linea += b.v2.get(b.v2.size()-1).v + "\n";
                    salidaTest.print(linea);
                }
            } catch (IOException e) {
                    System.out.println("Error al cerrar el archivo grafo");
            }
        }
        public static void ImprimirSalidaGrasp(ArrayList<dgbi.BiGrafo> bigrafo)
        {
            
            try {
                File test = new File("Tp34.out");
                FileOutputStream testStream = new FileOutputStream(test);
                PrintStream salidaTest = new PrintStream(testStream);         
                for(dgbi.BiGrafo b : bigrafo)
                {
                    salidaTest.print(b.cruces+"\n");
                    String linea = "";
                    for(int i = 0; i<b.v1.size()-1;i++)
                    {
                        linea += b.v1.get(i).v + " ";
                    }
                    linea += b.v1.get(b.v1.size()-1).v + "\n";
                    salidaTest.print(linea);
                    linea = "";
                    for(int i = 0; i<b.v2.size()-1;i++)
                    {
                        linea += b.v2.get(i).v + " ";
                    }
                    linea += b.v2.get(b.v2.size()-1).v + "\n";
                    salidaTest.print(linea);
                }
                salidaTest.close();
            } catch (IOException e) {
                    System.out.println("Error al cerrar el archivo grafo");
            }
        }
   }

